package com.csnj.common.utils;


import javax.persistence.Column;
import java.lang.reflect.Field;
import java.lang.reflect.Type;
import java.util.Date;


/**
 * 实体类相关工具类 
 * 解决问题： 1、快速对实体的常驻字段，如：createUser, createUid, updateUser, updateUid等值快速注入
 * 
 * @author Ace
 * @version 1.0
 * @date 2016年4月18日
 * @since 1.7
 */
public class EntityUtils {
	/**
	 * @param entity 实体bean 
	 * @author 王浩彬
	 */
	public static <T> void setCreatAndUpdatInfo(T entity) {
		setCreateInfo(entity);
		setUpdatedInfo(entity);
	}
	
	/**
	 * 快速将bean的crtUser、crtHost、crtTime附上相关值
	 * 
	 * @param entity 实体bean
	 * @author 王浩彬
	 */
	public static <T> void setCreateInfo(T entity){
		Integer uid = Integer.valueOf(BaseContextHandler.getUserID());
		String name = BaseContextHandler.getUsername();

		// 默认属性
		String[] fields = {"createUser", "createUid", "createTime"};
		Field field = ReflectionUtils.getAccessibleField(entity, "createUser");
		// 默认值
		Object [] value = null;
		if(field!=null){
			value = new Object []{name, uid, new Date()};
			// 填充默认属性值
			setDefaultValues(entity, fields, value);
		}

	}

	/**
	 * 快速将bean的updUser、updHost、updTime附上相关值
	 * 
	 * @param entity 实体bean
	 * @author 王浩彬
	 */
	public static <T> void setUpdatedInfo(T entity){
		Integer uid = Integer.valueOf(BaseContextHandler.getUserID());
		String name = BaseContextHandler.getUsername();

		// 默认属性
		String[] fields = {"updateUser", "updateUid", "udpateTime"};
		Field field = ReflectionUtils.getAccessibleField(entity, "updateUser");
		Object [] value = null;
		if(field!=null){
			value = new Object []{name, uid, new Date()};
			// 填充默认属性值
			setDefaultValues(entity, fields, value);
		}
	}
	/**
	 * 依据对象的属性数组和值数组对对象的属性进行赋值
	 * 
	 * @param entity 对象
	 * @param fields 属性数组
	 * @param value 值数组
	 * @author 王浩彬
	 */
	private static <T> void setDefaultValues(T entity, String[] fields, Object[] value) {
		for(int i=0;i<fields.length;i++){
			String field = fields[i];
			if(ReflectionUtils.hasField(entity, field)){
				ReflectionUtils.invokeSetter(entity, field, value[i]);
			}
		}
	}
	/**
	 * 根据主键属性，判断主键是否值为空
	 * 
	 * @param entity
	 * @param field
	 * @return 主键为空，则返回false；主键有值，返回true
	 * @author 王浩彬
	 * @date 2016年4月28日
	 */
	public static <T> boolean isPKNotNull(T entity,String field){
		if(!ReflectionUtils.hasField(entity, field)) {
			return false;
		}
		Object value = ReflectionUtils.getFieldValue(entity, field);
		return value!=null&&!"".equals(value);
	}

	/**
	 * 获取实体类中所有String类型的数据,并且用,号拼接返回
	 * @param clazz
	 * @param <T>
     * @return
     */
	public static <T> String getStringKeys(Class<T> clazz) {
		Field[] fields = clazz.getDeclaredFields();
		String s = "";
		for(Field f: fields) {
			Type t = f.getGenericType();
			//if(t.getTypeName().equals("java.lang.String")) {
				Column annotation = f.getAnnotation(Column.class);
				if(annotation != null) {
					s += annotation.name() + ',';
				} else {
					s = s+f.getName() + ',';
				}

			//}
		}
		return s;
	}
}
